前言
昨天的文章介紹了 Hadoop 的安裝,還沒完成安裝的請參考這裡:Day06 - Hadoop 安裝。
Hadoop 共有三種模式,分別是:
是 Hadoop 的預設模式,僅在單一個節點上的單個進程中運行,主要用於測試,不會於生產階段中使用。我們跟著官方文件來做一次簡單的 MapReduce的任務:
mkdir input
cp $HADOOP_HOME/etc/hadoop/*.xml input
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
cat output/*
在上面的任務中,我們建立 input 資料夾,並將路徑中的配置檔 (xml) 複製到 input 中,接下來執行範例的 MapReduce 程式來找到符合正則表達式的詞語 (dfs 開頭的詞),結果如下:
偽分佈模式,實際上還是在單一個節點上運行,不過使用多個進程來模擬多個節點,我們一樣跟著官方文件做一次 MapReduce 任務,並且使用 YARN 來做資源管理。
HDFS 配置設定
將下方配置填入etc/hadoop/core-site.xml
,fs.defaultFS
屬性用於指定默認的文件系統(通常是 HDFS)的 URL,這邊設為 hdfs://localhost:9000
。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
將下方配置填入etc/hadoop/hdfs-site.xml
,注意這裡的內容跟官方文件不太一樣!我自己照著官方文件做會出現錯誤訊息,顯示 nameNode 與 dataNode 的 clusterID 不一致,找到的解決辦法是定義 nameNode 與 dataNode 的屬性,注意 {{userName}}
要換成自己的使用者名稱。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/{{userName}}/hadoop/dfs/name336</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/{{userName}}/hadoop/dfs/data336</value>
</property>
</configuration>
創建對應的資料夾:
mkdir -p ~/hadoop/dfs/name336
mkdir -p ~/hadoop/dfs/data336
YARN 配置設定
將下方配置填入etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
將下方配置填入etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
啟動 HDFS/YARN
hdfs namenode -format
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
hdfs dfs -mkdir -p /user/<username>
執行 MapReduce
基本上就是重新做一次前面的 MapReduce,差別在於已經有資料夾了所以不用再 mkdir,另外印出結果的指令也不同。
cp $HADOOP_HOME/etc/hadoop/*.xml input
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
# 印出結果
# 方法1: 先把結果從 dfs 拿出來再印
hdfs dfs -get output output
cat output/*
# 方法2: 直接從 dfs 印出節果
hdfs dfs -cat output/*
執行結果如下,可以看到因為我們更新了一些配置,因此執行結果也有所改變。
終止 HDFS/YARN
$HADOOP_HOME/sbin/stop-dfs.sh # 終止 HDFS
$HADOOP_HOME/sbin/stop-yarn.sh # 終止 YARN
$HADOOP_HOME/sbin/stop-all.sh # 終止 全部
真正的分佈式模式,運行在多個節點上形成集群,細節可以參考 Hadoop Cluster Setup,因為接下來的內容比較不會碰到這部分所以先容我省略XD,有時間再深入寫這一塊!
下一篇會介紹 HDFS 的基本操作以及如何使用 Python API 操作 HDFS。
ps. 其實這篇跟前一篇的安裝原本是想要寫在一起,畢竟官方文件都寫在一起了,但實際在安裝跟配置的時候,總是會碰到一些「為什麼會這樣?」的時候,因此雖然兩篇的篇幅都不長,決定多留給大家一些解決問題的時間(才不是什麼文章寫不完呢 😉)
Hadoop: Setting up a Single Node Cluster.
Install Hadoop 3.3.2 in WSL on Windows